package ar.com.test.actualizadores;

import static org.easymock.EasyMock.*;

import java.util.List;
import java.util.Vector;



import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import ar.com.logic.components.actualizadores.ActualizadorPorDescarteSinUso;
import ar.com.logic.components.interfaces.IHistoricoRespuestas;
import ar.com.logic.components.interfaces.IMatrizPosiciones;
public class ActualizadorPorDescarteSinUsoUT {

	private IHistoricoRespuestas historicoMock;
	private IMatrizPosiciones matrizMock;
	private ActualizadorPorDescarteSinUso act;
	@Before
	public void setup(){
		historicoMock  = createMock(IHistoricoRespuestas.class);
		matrizMock  = createMock(IMatrizPosiciones.class);
		act = new ActualizadorPorDescarteSinUso();
	}
	
	@Test
	public void testDescartarNosUsados2Turnos(){
		// Se encontraron los 4 digitos en los primeros 2 turnos. 
		// Se descartan los sobrantes
		List<Integer> nnu = new Vector<Integer>();
		nnu.add(1);
		nnu.add(2);
		expect(historicoMock.getCantidadNumerosNoUtilizados()).andReturn(2);
		expect(historicoMock.getUltimoTurno()).andReturn(2).times(3);
		expect(matrizMock.getMaxPosiciones()).andReturn(4).times(2);
		expect(matrizMock.getMaxDigitos()).andReturn(10);
		expect(historicoMock.obtenerTotalEncontradosEnNUltimasRespuestas(2)).andReturn(4);
		expect(historicoMock.getNumerosNoUtilizados()).andReturn(nnu);
		matrizMock.descartarValor(1);
		matrizMock.descartarValor(2);
		historicoMock.borrarNoUtilizados();
		replay(historicoMock);
		replay(matrizMock);
		Assert.assertEquals(true, act.actualizar(matrizMock, historicoMock));
		verify(historicoMock);
		verify(matrizMock);
	}
	
	@Test
	public void testDescartarNoUsados1Turnos(){
		/* Se encontraron los 4 digitos en el primer turno, 
			se descartan los sobrantes
		*/
		List<Integer> nnu = new Vector<Integer>();
		nnu.add(1);
		nnu.add(2);
		nnu.add(3);
		nnu.add(4);
		nnu.add(5);
		nnu.add(6);
		expect(historicoMock.getCantidadNumerosNoUtilizados()).andReturn(6);
		expect(historicoMock.getUltimoTurno()).andReturn(1).times(3);
		expect(matrizMock.getMaxPosiciones()).andReturn(4).times(2);
		expect(matrizMock.getMaxDigitos()).andReturn(10);
		expect(historicoMock.obtenerTotalEncontradosEnNUltimasRespuestas(1)).andReturn(4);
		expect(historicoMock.getNumerosNoUtilizados()).andReturn(nnu);
		matrizMock.descartarValor(1);
		matrizMock.descartarValor(2);
		matrizMock.descartarValor(3);
		matrizMock.descartarValor(4);
		matrizMock.descartarValor(5);
		matrizMock.descartarValor(6);
		
		historicoMock.borrarNoUtilizados();
		replay(historicoMock);
		replay(matrizMock);
		Assert.assertEquals(true, act.actualizar(matrizMock, historicoMock));
		verify(historicoMock);
		verify(matrizMock);
	}
	@Test
	public void testNoDescartarNoUsados2TurnosNoUsadoSolucion(){
		/* No se encontraron los 4 digitos en los 2 primeros turnos.
		 * Al menos Uno de los numeros no usados es solucion
		 * No se descarta nada
		*/
		
		expect(historicoMock.getCantidadNumerosNoUtilizados()).andReturn(2);
		expect(historicoMock.getUltimoTurno()).andReturn(2).times(3);
		expect(matrizMock.getMaxPosiciones()).andReturn(4).times(2);
		expect(matrizMock.getMaxDigitos()).andReturn(10);
		expect(historicoMock.obtenerTotalEncontradosEnNUltimasRespuestas(2)).andReturn(3);
		replay(historicoMock);
		replay(matrizMock);
		Assert.assertEquals(false, act.actualizar(matrizMock, historicoMock));
		verify(historicoMock);
		verify(matrizMock);
	}
	
	@Test
	public void testNoDescartarNoUsados1TurnosNoUsadoSolucion(){
		/* No se encontraron los 4 digitos en el primer turno.
		 * Al menos Uno de los numeros no usados es solucion
		 * No se descarta nada
		*/
		
		expect(historicoMock.getCantidadNumerosNoUtilizados()).andReturn(2);
		expect(historicoMock.getUltimoTurno()).andReturn(1).times(2);
		expect(matrizMock.getMaxPosiciones()).andReturn(4).times(1);
		expect(matrizMock.getMaxDigitos()).andReturn(10);
		replay(historicoMock);
		replay(matrizMock);
		Assert.assertEquals(false, act.actualizar(matrizMock, historicoMock));
		verify(historicoMock);
		verify(matrizMock);
	}
	
	@Test
	public void testSeSupera2TurnosDescartaActualizador(){
		/* Se superaron los 2 turnos, se descarta (return true sin modificar)
		*/
		
		expect(historicoMock.getCantidadNumerosNoUtilizados()).andReturn(2);
		expect(historicoMock.getUltimoTurno()).andReturn(3).times(2);
		expect(matrizMock.getMaxPosiciones()).andReturn(4).times(1);
		expect(matrizMock.getMaxDigitos()).andReturn(10);
		replay(historicoMock);
		replay(matrizMock);
		Assert.assertEquals(true, act.actualizar(matrizMock, historicoMock));
		verify(historicoMock);
		verify(matrizMock);
	}
	
}
